package HTTP介绍

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"net/url"
)

// 演示
func testGet1() {
	resp, err := http.Get("http://apis.juhe.cn/simpleWeather/query?city=北京&key=087d7d10f700d20e27bb753cd806e40b")
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()

	fmt.Println(resp.Status) // 200 OK
	fmt.Println(resp.Header) // 响应头

	// 接收服务端信息
	n, _ := ioutil.ReadAll(resp.Body)
	fmt.Printf("查询结果:%v\n", string(n))
}

// GET请求，把参数做成变量
func testGet2() {
	params := url.Values{}
	Url, err := url.Parse("http://apis.juhe.cn/simpleWeather/query")
	if err != nil {
		return
	}
	params.Set("key", "087d7d10f700d20e27bb753cd806e40b")
	params.Set("city", "北京")
	//如果参数中有中文，先进行urlEncode
	Url.RawQuery = params.Encode()
	urlPath := Url.String() //http://apis.juhe.cn/simpleWeather/query?city=%E5%8C%97%E4%BA%AC&key=087d7d10f700d20e27bb753cd806e40b
	fmt.Println(urlPath)

	resp, err := http.Get(urlPath)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()

	fmt.Println(resp.Status) // 200 OK
	fmt.Println(resp.Header) // 响应头

	// 接收服务端信息
	body, _ := ioutil.ReadAll(resp.Body)
	fmt.Printf("查询结果:%v\n", string(body))
}

// 解析json
func testGet3() {
	resp, err := http.Get("http://httpbin.org/get")
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	body, _ := ioutil.ReadAll(resp.Body)
	fmt.Println(string(body))

	//json解析时需要结构体成员大写开头，不然就被忽略
	type result struct {
		Args   string            `json:"args,omitempty"`
		Header map[string]string `json:"header,omitempty"`
		Origin string            `json:"origin,omitempty"`
		Url    string            `json:"url,omitempty"`
	}
	var res result
	_ = json.Unmarshal(body, &res)
	fmt.Println(res)
}

// 客户端
func testGet4() {
	client := &http.Client{}
	rep, _ := http.NewRequest("GET", "http://httpbin.org", nil)
	rep.Header.Add("token", "bearer xxxxx")
	rep.Header.Add("cookie", "xxxxxxx")
	resp, _ := client.Do(rep)
	boby, _ := ioutil.ReadAll(resp.Body)
	fmt.Println(string(boby))
}
